import { pageRecords } from '@/interface/pageInterface';

export interface BaseService<T> {
  /**
   *  先查询是否存在，在注册
   * @param t   要添加的数据
   * @param filed  可选：字段
   * @param value  可选：值
   */
  saveAtferExist(field: string, value: string, t: T): Promise<number | boolean>;
  /**
   * 添加一条数据
   * @param t
   */
  save(t: object): Promise<number>;

  /**
   * 批量插入数据
   * @param tArr
   */
  // TODO  以后批量新增用Excel来。
  /*
  考虑校验问题:
  insertMany(
   @Body(new ParseArrayPipe({ items: SysInsertDto })) body: SysInsertManyDto,
  ): Promise<unknown> {
  }
  */
  // saveAll(tArr: Array<T>): Promise<number>;

  /**
   * 更新一条数据
   * @param id        要更新的ID
   * @param newDate   新的数据
   */
  update(id: T, newDate: object): Promise<T>;

  /**
   *
   * @param t       删除的数据
   */
  deleteOneById(t: T): Promise<T>;

  /**
   *
   * @param ids:Array<number> 根据id批量删除
   */
  deleteByIds(ids: Array<T>): Promise<number>;

  /**
   * @param id     要设置的是数据的id
   * @param state  0: 不可以 1:可用
   */
  setStatus(id: T, state: number): Promise<T>;

  /**
   *
   * @param t  查询的数据：默认不带status为false的
   */
  getOneById(t: T): Promise<any>;

  /**
   *
   * @param order         排序
   * @param pageSize      一页显示几条
   * @param pageNumber    第几页
   */
  getAllWithPageOrOrder(
    field?: string,
    sort?,
    pageSize?: number,
    pageNumber?: number,
  ): Promise<pageRecords<T>>;

  /**
   * 根据字段查出属于该字段的内容，用于role 分类
   * @param field       example:role_id
   * @param value       查询的值
   * @param pageSize    可选: 一页显示的数量,默认:dev:5,prod:10
   * @param pageNumber  可选: 第几页,默认:dev:1,prod:10
   * @param sort        可选: 排序规则:"ASC","DESC"中的一个
   * @param condition   可选: 查询条件:like = > < 中的一个
   *
   */
  findManyByField(
    field: string,
    value: string,
    pageSize?: number,
    pageNumber?: number,
    sort?: string,
    condition?: string,
  ): Promise<pageRecords<T>>;

  /**
   * 根据字段like查询
   * @param field       字段名称
   * @param value       根据什么模糊查询
   * @param pageSize    可选: 一页显示的数量,默认:dev:5,prod:10
   * @param pageNumber  可选: 第几页,默认:dev:1,prod:10
   */
  search(
    field: string,
    value: string,
    pageSize?: number,
    pageNumber?: number,
  ): Promise<pageRecords<T>>;
}
